package cn.gaozhong.basic.service.impl;

import cn.gaozhong.basic.constart.BaseConstant;
import cn.gaozhong.basic.dto.RegisterDto;
import cn.gaozhong.basic.exception.CustomException;
import cn.gaozhong.basic.service.IVerifyCodeService;
import cn.gaozhong.basic.util.SmsUtils;
import cn.gaozhong.basic.util.StrUtils;
import cn.gaozhong.basic.util.VerifyCodeUtils;
import cn.gaozhong.user.domain.User;
import cn.gaozhong.user.mapper.UserMapper;
import net.bytebuddy.implementation.bytecode.Throw;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;


@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserMapper userMapper;
    @Override
    public String imgCode(String key) {
       if (!StringUtils.hasLength(key)){
            throw  new CustomException("key不能为空");
       }
//        。生成code = 9527
        String code = StrUtils.getComplexRandomString(4);
        redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);
//        。保存redis，设置过期时间  key是什么==前端请求给我传递的UUID
               //前端传递的UUID
                //图片中的码儿
                //过期时间
                //过期时间的单位
//        。使用2D引擎把code画成图
//        。把图使用Base64编码成字符串
//        。返回Base64编码的字符串


        return VerifyCodeUtils.VerifyCode(100,40,code);
    }

    /**
     * 发送短信验证
     * @param dto
     */
    @Override
    public void sendSmsCode(RegisterDto dto) {
//        1、校验：空校验、校验图形验证码根据存储图形验证码的key从redis获取图形验证码
//  。获取不到：图形验证码已经失效，重新获取
//  。获取到了 ，比对图形验证码是否正确
//                --不正确，提示输入图形验证码错误
//                --正确，往下走
//        2、校验手机号是否注册过
//  。注册过了，直接去登录
//  。没有注册过，往下走
//        3、短信验证码逻辑
// 。根据手机号拼接key，从redis中获取曾经可能发送过得短信验证码
//                -获取到了
//                =校验是否过了一分钟重发时间
//           ···小于一分钟
//           ···大于一分钟   （h还没有到3分钟，验证码还有效），使用还没有过期的验证码，刷新过期时间
//                -获取不到
//                =生成新的短信验证码
//        4、生成短信验证码
//        5、存储redis
//        6、发送短信

        String phone = dto.getPhone();
        String imageCodeValue = dto.getImageCodeValue();
        String imageCodeKey = dto.getImageCodeKey();
//        1、校验：空校验、
        if (StringUtils.isEmpty(phone)
                ||StringUtils.isEmpty(imageCodeValue)
                ||StringUtils.isEmpty(imageCodeKey)){
            throw new CustomException("参数不能为空！！！！！！");
        }
        //  。获取不到：图形验证码已经失效，重新获取
        Object codeKey = redisTemplate.opsForValue().get(imageCodeKey);
        if(codeKey==null){
            throw new CustomException("图形验证码已经失效，请重新获取");
        }
//        --不正确，提示输入图形验证码错误
        if(!codeKey.toString().equalsIgnoreCase(imageCodeValue)){
            throw new CustomException("图形验证码错误");
        }
        User user = userMapper.loadByPhone(phone);
        if (user!=null){
            throw new CustomException("已经注册过，请直接登录");
        }
//        根据手机号拼接key，从redis中获取曾经可能发送过得短信验证码
        String key = BaseConstant.RegisterConstants.REGISTER_SMS_PREFIX + phone;
        Object codeTmp = redisTemplate.opsForValue().get(key);
        String smsCode = "";
//        -获取到了
        if (codeTmp!=null){
            Long codeTime = Long.valueOf(codeTmp.toString().split(":")[1]);
//         =校验是否过了一分钟重发时间
//          ···小于一分钟
            if (System.currentTimeMillis()- codeTime <= 1*60*1000){
                throw new CustomException("***********");
            }
//          ···大于一分钟
//           使用还没有过期的验证码，刷新过期时间
            smsCode = codeTmp.toString().split(":")[0];
        }else {
//           =生成新的短信验证码
            smsCode = StrUtils.getComplexRandomString(4);
        }
        String s = smsCode + ":" + System.currentTimeMillis();
        redisTemplate.opsForValue().set(key,s,3, TimeUnit.MINUTES);
        /*SmsUtils.sendSms(phone,"请在3分钟内使用："+smsCode);*/
        System.out.println("请在3分钟内使用：" + smsCode);

    }
}
